package org.microframework.cloud.gateway.config;

import lombok.Data;

import java.util.List;

/**
 * 访问控制配置
 * 与JSON配置文件对应的数据结构
 */
@Data
public class AccessControlConfig {

    /**
     * IP白名单配置
     */
    private IpWhitelist ipWhitelist;

    /**
     * IP黑名单配置
     */
    private IpBlacklist ipBlacklist;

    /**
     * 路径白名单配置
     */
    private PathWhitelist pathWhitelist;

    /**
     * 路径黑名单配置
     */
    private PathBlacklist pathBlacklist;

    /**
     * 安全配置
     */
    private SecurityConfig securityConfig;

    /**
     * IP白名单配置
     */
    @Data
    public static class IpWhitelist {
        /**
         * 是否启用IP白名单
         */
        private boolean enabled;

        /**
         * IP白名单列表
         */
        private List<String> ips;

        /**
         * 是否忽略本地地址（127.0.0.1和0:0:0:0:0:0:0:1）
         */
        private boolean ignoreLocalhost;

        /**
         * 白名单IP是否跳过认证
         */
        private boolean bypassAuth;
    }

    /**
     * IP黑名单配置
     */
    @Data
    public static class IpBlacklist {
        /**
         * 是否启用IP黑名单
         */
        private boolean enabled;

        /**
         * IP黑名单列表
         */
        private List<String> ips;

        /**
         * 黑名单IP访问时返回的错误消息
         */
        private String message;
    }

    /**
     * 路径白名单配置
     */
    @Data
    public static class PathWhitelist {
        /**
         * 是否启用路径白名单
         */
        private boolean enabled;

        /**
         * 路径白名单列表
         */
        private List<String> paths;

        /**
         * 白名单路径是否跳过认证
         */
        private boolean bypassAuth;

        /**
         * 白名单路径是否跳过限流
         */
        private boolean bypassRateLimit;
    }

    /**
     * 路径黑名单配置
     */
    @Data
    public static class PathBlacklist {
        /**
         * 是否启用路径黑名单
         */
        private boolean enabled;

        /**
         * 路径黑名单列表
         */
        private List<String> paths;

        /**
         * 黑名单路径访问时返回的错误消息
         */
        private String message;
    }

    /**
     * 安全配置
     */
    @Data
    public static class SecurityConfig {
        /**
         * 是否记录访问控制日志
         */
        private boolean logEnabled;

        /**
         * 日志级别：INFO、WARN、ERROR
         */
        private String logLevel;

        /**
         * 阻止请求时的响应配置
         */
        private BlockResponse blockResponse;

        /**
         * 阻止请求响应配置
         */
        @Data
        public static class BlockResponse {
            /**
             * 响应状态码
             */
            private int code;

            /**
             * HTTP状态码
             */
            private int status;

            /**
             * 错误消息
             */
            private String message;

            /**
             * 是否显示详细信息
             */
            private boolean showDetail;
        }
    }
} 